//
//  ReadMe.h
//  WeiBo
//
//  Created by apple on 16/6/23.
//  Copyright © 2016年 itheima. All rights reserved.
//

/*
 
 http://www.devdiv.com
 http://github.ibireme.com/github/list/ios/

 
 设计模式:
 
 单例模式
 代理设计模式
 Targe-Action
 观察者
 工厂设计模式
 桥接设计模式
 响应者链
 
 
 
 
 xcode 4.0 -> iOS 5.0 iPhone 4s
 xcode 4.3  -> iOS 6.0 iPhone 5     2012年
 xcode 5.0  -> iOS 7.0 iPhone 5s    2013年
 xcode 6.0  -> iOS 8.0  swift 1.0 iPhone 6      2014年
 xcode 7.0  -> iOS 9.0  swift 2.0       xcode 7.3 -> swift 2.2  iPhone 6s
 xcode 8.0 bate  -> iOS 10.0  swift 3.0
 
 企业开发思想
    1. 分析界面的时候要紧盯特殊功能/难点功能,但是实现的时候要把特殊功能/难点功能放在最后分析/实现,先去实现普通的或者说共有的功能
    2. 遇到新的东西的时候,需要大家思路一些线索,然后根据这些线索去查看API,然后一个一个方法的试,如果实现了就暂时用这样的方法.
    3. 把一些重复的东西或者说一些没用的东西,屏蔽在底层实现上
    4. 解决问题一个一个解决,不要对问题进行任何关联;待所有问题解决完成之后,再根据具体问题具体关联
    5. 首先根据圆形以及效果图,把需求分析清楚 -- 我们知道要干什么; 进行接口的调试 -- 我们就有数据 ; 实现界面(有点思路就可以,不要想着一下就把功能实现了,长城不是一天累成),再去实现功能,解决bug -- ;
    6. 先去实现普遍的功能,再去思考特殊功能
    7. 把需求或者把遇到的问题,描述清楚[描述的越清楚,越细致],对你分析问题都很有帮助
    8. 可以抽取的类方法,一定要多用类方法.除了调用方便,还不用创建对象[节省内存]
    9. 多去分析事件发生的时间点
    接口数据很多的时候,我们不用刻意去看所有的数据,需要哪个再找哪个
 
 面试体:
    1.面向对象的三大特点: 封装/继承/多态
    2.视图控制器中 View的生命周期(viewDidLoad 走几次? viewwillAppear 会走几次?)
    3.status code: 200
    4.UIButton的父类.考察点: 1.继承关系2.自定义继承UIControl
    5. 如何更新约束动画? 去调用 视图的layoutIfNeeded 
    6. 通知和代理(闭包)的区别
        多对一用通知; 多层跳转(传值)用通知;
 
    7. assign 与 weak的区别
    8. 如何适配 iOS9中的 UIStackView
 
 第一.
    1.先完成普通的tabbar的实现
    2.修改tabbaritem控件的位置
    3. 再添加一个点击的控件
 
 第二.访客视图的实现-- 自定义视图都可以按照这样的步骤进行
    1.懒加载控件
    2.添加控件实现布局
    3.实现一些功能
 
 第三.oauth授权认证
    1. 加载网页
    2. 输入用户名和密码,然后点击登录
    3. 点击授权(授权页面很少出现)
    4. 会返回给我们一个url,这个url含有一个code
    5. 我们需要获取这个code,然后通过网络请求,来获取Token(令牌)
    6. 可以通过令牌来获取个人信息/微博信息等用户信息
 
 
 第四.接口文档 -- 想要从服务器获取数据的唯一文档
    接口文档都需要看那些东西?
    1.url
    2.查看请求方式
    3.[重点] 请求参数 -- 看那些参数是必选参数
    // https://api.weibo.com/oauth2/authorize?client_id=308738166&redirect_uri=http://www.itcast.cn&response_type=code 
    4.[重点] 返回参数 --
    5. [可选] 请求示例以及返回示例
 
 第五. 去开放平台申请应用 -- 以后所有的授权以及第三方分享都需要去开发平台申请注册应用
    
    1. 到 open.weibo.com 申请开发者 -- 一定要有一个微博账号(前提)
    2. 点击创建应用,然后完善个人信息.注意: 邮箱一定要正确,因为需要验证邮箱
   
    3. 点击微连接,创建移动应用
    4. 完善移动应用信息
    
    5. 在基本信息里 获取 AppKey以及AppSecret
    6. 在高级信息里,设置 授权回调页
    7. 在测试信息里,添加想要成为测试的账号昵称
 
 第六. 视图切换的流程
    1.当没有登录的时候,显示是 访客视图 ;
    2.当登录的时候,显示的是欢迎界面,欢迎界面完成之后,是首页
    // 如果说你屡不清登录逻辑的话,问产品经理
    3.没有登录的时候,我们点击注册,授权成功之后跳转到欢迎界面;欢迎界面之后跳转的是首页
 
 
 第七. 转发微博的实现
    1.有转发微博,也有原创微博;我们针对这样的情况,采用一刀切 -- 全是转发微博
    2.再去根据具体的数据或者效果去改变
    3.去改bug; 约束一定要注册cell的重用
 
 第八.自定义下拉刷新
    1. 继承自UIControl: 因为原来的类 UIRefreshControl 有一些视图,我们不需要;
    2. 系统的有默认的宽和高,我们也设置宽和高
    3. 添加到tabelView上
    4. 解决视图的位置问题: 去修改refreshView的y
    5. 懒加载控件
    6. 怎么知道下拉了多少? -- KVO
    7. 我们把KVO添加到HMRefreshView里,需要Tableview: willMoveToSuperview帮助我们拿到tableView
    8. 需要分析出下拉刷新的三种状态: 正常状态;拖拽的状态;加载数据的状态
    9. 分析出这三种状态改变的临界值
    
    针对于界面效果或者bug去做优化
    10. 会多次请求网络,或者其他状态会多次调用?  优化调用一次,添加标志位
    11. 实现了加载过程中视图的向下移动
 
第九.下拉刷新提示
    需求: 当数据加载完成之后,从顶部出来一个提示视图
    控件: UIView, UILabel
 
 第十. Pop视图以及动画
 
    1. 点击按钮的时候,跳转一个视图
    2. 毛玻璃效果
        2.1 获取到当前屏幕的截图,然后设置成背景图片
        2.2 设置背景图片的毛玻璃效果
    3. 添加按钮
        3.1 自定义按钮
        3.2 重写layoutSubViews 方法来修改子控制的frame
        3.3 添加6个按钮,从沙盒读取数据,然后遍历添加按钮
 
    4. 实现按钮的动画
        4.1 拿了一个按钮,测试了一下 pop动画
        4.2 定义了一个动画方法,参数有 UIButton, 动画开始时间,方向
        4.3 通过数组遍历的反转 reverse ,实现向下按钮的动画
 
    5. 按钮的点击
        5.1 遍历按钮,设置按钮的alpha = 0
        5.2 设置被点击的按钮放大,没有被点击的按钮变小
        5.3 页面跳转
 
 第十一.图片选择器
    1.创建一个CollectionView
    2.设置CollectionView的属性以及实现数据源方法
    3.选择图片,然后更新一下数据源
    4.自定义cell,然后显示图片
        4.1 UIImageView
        4.2 删除的按钮
    5.添加一个 加号,实现加号的功能
 
 
 第十二.表情键盘
    1.表情键盘分2部分: 底部视图 + 上边的UICollectionView
    2. 底部视图
        2.1 一个视图放4个button(类似于首页的功能底部视图)
    3.UICollectionView
        3.1 有几个表情包,就有几个Section
        3.2 一个Section,对应着一组表情; 一组表情有分 多页;每页 有20个表情 + 1个删除按钮
        3.3 每页的20个表情,需要我们按照九宫格的计算形式给它设置frame
 
 
 抽取代码的步骤:
    1. 把要抽取的代码复制过来
    2. 哪里出错改哪里,一定要确保没有任何问题
    3.把复制的代码,注释了!!!
 
 
 第十三.图片浏览器
 
    分析功能:
    1. 点击其中的一张图片,跳转出一个视图,并显示对应的图片
    2. 最初是一张小图, 小图有一个加载的进度视图
    3. 加载完成之后,变成大图
    4. 大图: 如果超过屏幕的高度,可以滚动; 没有超过,居中显示
    5. 点击大图,可以消失
    6. 关闭和保存按钮,保存按钮可以保存图片
 
    分析视图结构
    1.UICollectionView实现
    2. 关闭按钮和保存按钮放一个view上
 
    分析难点:
    1. 显示对应的图片
    2. 小图怎么取 -- 先拿一张固定的图片展示
    3. ***小图有一个加载的进度视图
    4. 大图不知道哪里来 -- UIImageView + SDWebimage
    5. UIScrollView
    6.
 
    步骤:
        1.通过通知实现了一下视图控制器的model
        2.懒加载视图: UICollectionView/UIButton
        3.设置UICollectionView的属性以及数据源方法
        4.自定义Cell
        5.通过SDWebImage 实现展示小图
        6.替换小图的url
        7.在Cell里添加了一个UIScrollView.在UIScrollView里添加了一个UIImageView
        8. 通过SDWebImage 下载大图,在下载完成的方法里,设置图片的大小
        9. 自定义HMProgressView. 我们先创建了一个菊花
        10. 自定义HMProgressCicleView,实现了他的drawRect 
        11. 属性传值传递 progress; 重点注意: 重绘要调用 setNeedsDisPlay
        12. 其他的细节
 
 
 
 
 自定义视图三部曲
 

// 第一步 -- 重写构造函数
override init(frame: CGRect) {
    super.init(frame: frame)
    
    setupUI()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

// 第二步 -- 定义一个方法,来实现 视图的添加和布局
private func setupUI(){
    
    
    
}

// 第三步: 懒加载控件

 */
